package com.atguigu.gulimall.seckill;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * 一、整合Sentinel
 * 1. 导入依赖
 * 2. 下载控制太
 * 3. 配置sentinel控制太地址信息
 * 4. 在控制台中调整参数，【默认所有的流控设置保存在内存中，重启失效】
 *
 *
 * 二、每个模块导入actuator依赖，进行信息审计功能；并配置management.endpoints.web.exposure.include=*    主要用来实现信息统计
 * 三、自定义sentinel流控返回数据  UrlBlockSentinelHandler
 * 四、使用sentinel保护feign远程调用，熔断；  给调用方配置熔断后返回的数据。
 *    1. 调用方法的熔断保护：feign.sentinel.enabled=true
 *    2. 调用方手动指定（在sentinel平台中）远程服务的降级策略.远程服务被降级处理，触发我们的熔断回调方法
 *    3. 超大浏览时，必须牺牲一些远程服务。在服务的提供方（远程服务）指定降级策略。
 *        提供方是在运行，但是不运行自己的业务逻辑，返回的是默认的熔断数据（限流数据）
 *五、自定义受保护的资源。
 *     1. 基于代码： try (Entry entry = SphU.entry("seckillSkus")) catch（）的方式
 *     2. 基于注解   @SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
 *
 *      无论是1/2  一定要配置被限流后的默认返回，否则会返回错误信息
 *      但是，通过配置BlockExceptionHandler（在config中统一配置） 可以实现统一返回
 *
 */
@EnableRedisHttpSession // 整合spring session
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@EnableFeignClients
//@EnableRabbit  监听mq消息时候在加
public class GulimallSeckillApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallSeckillApplication.class, args);
    }

}
